home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / gpen32k / source / lib / osrc / keyin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  1.7 KB  |  103 lines

  1. /*
  2.             指定サイズ文字入力関数 Ver.1.010
  3.                                             Okome System
  4. */
  5.  
  6. #include    <string.h>
  7. #include    <MOS.H>
  8. #include    <FMCfrb.h>
  9. #include    <kkstr2.h>
  10. #include    <Normlib.h>
  11.  
  12. extern int kkx, kky;
  13.  
  14. int keyin(int x, int y, char *nn, int l, int c0, int c1, int p )
  15. {
  16.     static int xp=0;
  17.     unsigned int m, k;
  18.     int sl, r = 3;
  19.     sl = strlen(nn);
  20.     kkx = x + xp*8;
  21.     kky = y;
  22.     if (xp > sl)
  23.         xp = sl;
  24.     do    {
  25.         m = KYB_read(1, &k);
  26.     }    while((m & 0xff00) == 0xff00 && KAN_inpchk()==KAN_MISET);
  27.     if ( (m & 0xff00) != 0xff00)
  28.     {
  29.         switch(m)
  30.         {
  31.         case 0x08:
  32.             if (sl) {
  33.                 if (xp==0) {
  34.                     xp++;
  35.                     if (iskanji3(nn,xp+1)==3)
  36.                         xp++;
  37.                 }
  38.                 if (iskanji3(nn,xp)==3) {
  39.                     strcpy(&nn[xp-2], &nn[xp]);
  40.                     sl--;
  41.                     xp--;
  42.                 } else
  43.                     strcpy(&nn[xp-1], &nn[xp]);
  44.                 sl--;
  45.                 xp--;
  46.             }
  47.             break;
  48.         case 0x0d:
  49.         case 0x8012:
  50.             xp = 0;
  51.             r = 0;
  52.             break;
  53.         case 0x1d:
  54.             if (xp) {
  55.                 xp--;
  56.                 if (iskanji3(nn,xp+1)==3)
  57.                     xp--;
  58.             }
  59.             break;
  60.         case 0x1c:
  61.             if (xp<sl) {
  62.                 xp++;
  63.                 if (iskanji3(nn,xp+1)==3)
  64.                     if (xp<sl)
  65.                         xp++;
  66.                     else
  67.                         xp--;
  68.             }
  69.             break;
  70.         case 0x7f:
  71.             if (xp<sl)
  72.                 strcpy(&nn[xp], &nn[xp+iskanji3(nn,xp+1)]);
  73.             break;
  74.         case 0x1b:
  75.         case 0x8011:
  76.             r = 2;
  77.             break;
  78.         default:
  79.             if (0x1F < m && m < 0x100) {
  80.                 if (sl<l) {
  81.                     _rstrcpy( &nn[xp+1], &nn[xp] );
  82.                     sl++;
  83.                     nn[xp] = m;
  84.                     if (xp<l-1) xp++;
  85.                 }
  86.                 else if (iskanji3(nn,l)==2) {
  87.                     nn[l-1] = 0;
  88.                     sl--;
  89.                 }
  90.             }
  91.         }
  92.     }
  93.     if ( m / 0x100 != 0xff || p) {
  94.         MOS_disp(0);
  95.         boxf( x, y, x+l*8-1, y+15, c1 );
  96.         symbol( x,y+15, nn, 16, c0 );
  97.         if (r)
  98.             boxb( x + xp*8, y, x + xp*8+1, y+15, 0xa );
  99.         MOS_disp(1);
  100.     }
  101.     return (r);
  102. }
  103.